Introdução

Antes de começar a fazer visualizações de dados devemos saber se nossos dados estão todos organizados e formatados corretamente, é raro que recebamos tudo organizado. Por isso é importante saber transformar os dados, o pacote dplyr, presente no tidyverse, ajuda bastante nisso e aprenderemos um pouco sobre isso nesse capítulo, usaremos o pacote nycflights13 para fazer os tratamentos.

data(flights)
flights
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Podemos ver a estrutura do banco de dados por meio de dois comandos simples, head e str.

str(flights)
## tibble[,19] [336,776 x 19] (S3: tbl_df/tbl/data.frame)
##  $ year          : int [1:336776] 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
##  $ month         : int [1:336776] 1 1 1 1 1 1 1 1 1 1 ...
##  $ day           : int [1:336776] 1 1 1 1 1 1 1 1 1 1 ...
##  $ dep_time      : int [1:336776] 517 533 542 544 554 554 555 557 557 558 ...
##  $ sched_dep_time: int [1:336776] 515 529 540 545 600 558 600 600 600 600 ...
##  $ dep_delay     : num [1:336776] 2 4 2 -1 -6 -4 -5 -3 -3 -2 ...
##  $ arr_time      : int [1:336776] 830 850 923 1004 812 740 913 709 838 753 ...
##  $ sched_arr_time: int [1:336776] 819 830 850 1022 837 728 854 723 846 745 ...
##  $ arr_delay     : num [1:336776] 11 20 33 -18 -25 12 19 -14 -8 8 ...
##  $ carrier       : chr [1:336776] "UA" "UA" "AA" "B6" ...
##  $ flight        : int [1:336776] 1545 1714 1141 725 461 1696 507 5708 79 301 ...
##  $ tailnum       : chr [1:336776] "N14228" "N24211" "N619AA" "N804JB" ...
##  $ origin        : chr [1:336776] "EWR" "LGA" "JFK" "JFK" ...
##  $ dest          : chr [1:336776] "IAH" "IAH" "MIA" "BQN" ...
##  $ air_time      : num [1:336776] 227 227 160 183 116 150 158 53 140 138 ...
##  $ distance      : num [1:336776] 1400 1416 1089 1576 762 ...
##  $ hour          : num [1:336776] 5 5 5 5 6 5 6 6 6 6 ...
##  $ minute        : num [1:336776] 15 29 40 45 0 58 0 0 0 0 ...
##  $ time_hour     : POSIXct[1:336776], format: "2013-01-01 05:00:00" "2013-01-01 05:00:00" ...

Flights apresenta informações sobre todos os voos que saíram de Nova York em 2013 entre seus 3 aeroportos e destinos, horarios previstos e reais de saida e chegada, durações, entre outros.

Esse data frame é na verdade um tibble, df um pouco melhorados de um pacote presente no tidyverse.

Nesse capítulo abordaremos as 6 principais funções do dplyr que podem ser usadas para resolver a grande maioria dos problemas em relação à manipulação de dados.

filter() = Escolher observações baseadas em seus valores

arrange() = Reordenar Linhas

select() = Escolher variáveis pelo nome

mutate() = Criar novas variáveis com funções em relação a variáveis existentes

summarise() = Colapsar varios valores para apenas um sumário.

grouoby -> Todos podem ser usados juntos com group_by() que troca o escopo das funções para operar por grupos ao invés do dataset inteiro.

Todos funcionam de maneira similar, o primeiro argumento é um dataframe, os argumentos a seguir apontam o que deve ser feito com o df e o resultado é outro dataframe.

5.2 Filter rows with filter()

Vamos filtrar por exemplo o dataframe apenas por voos de 1 janeiro

filter(flights,month==1,day==1)
## # A tibble: 842 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 832 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

A função nunca vai alterar o input, dessa maneira se quisermos salvar devemos fazer uma atribuição com o resultado.

jan1 <- filter(flights,month==1,day==1)

Se quiser imprimir, e fazer uma atribuição devemos colocar entre parentêses.

(dez25 <- filter(flights,month==12,day==25))
## # A tibble: 719 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013    12    25      456            500        -4      649            651
##  2  2013    12    25      524            515         9      805            814
##  3  2013    12    25      542            540         2      832            850
##  4  2013    12    25      546            550        -4     1022           1027
##  5  2013    12    25      556            600        -4      730            745
##  6  2013    12    25      557            600        -3      743            752
##  7  2013    12    25      557            600        -3      818            831
##  8  2013    12    25      559            600        -1      855            856
##  9  2013    12    25      559            600        -1      849            855
## 10  2013    12    25      600            600         0      850            846
## # ... with 709 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

5.2.1 Comparisons

Devemos fazer comparações para filtrar os dataframes para isso devemos saber fazer comparações, que retornam true ou false. Temos que lidar com problemas do ponto flutuante que pela limitação da mantissa, operações que são obvias retornam resultados errados. EX:

sqrt(2.0)^2.0 ==2.0
## [1] FALSE
1/49*49 == 1
## [1] FALSE
near(sqrt(2)^2,2)
## [1] TRUE
near(1/49*49,1)
## [1] TRUE

Voos de primeiro de Janeiro com duração maior que 5 horas.

filter(flights,day==1,month==1,air_time>300)
## # A tibble: 128 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      558            600        -2      924            917
##  2  2013     1     1      558            600        -2      923            937
##  3  2013     1     1      559            600        -1      854            902
##  4  2013     1     1      611            600        11      945            931
##  5  2013     1     1      622            630        -8     1017           1014
##  6  2013     1     1      627            630        -3     1018           1018
##  7  2013     1     1      628            630        -2     1016            947
##  8  2013     1     1      646            645         1     1023           1030
##  9  2013     1     1      651            655        -4      936            942
## 10  2013     1     1      655            700        -5     1037           1045
## # ... with 118 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Voos que não saíram do aeroporto JFK no natal

filter(flights)
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

5.2.2 Operadores Lógicos

Devemos saber o funcionamento dos operadores lógicos para as comparações, já temos essa noção, mas o livro aborda em um pedaço. No R temos & == and , | == or e ! == not.

Existe um operador utíl para substituir cadeias de or (OPERADOR %in% ). Exemplo:

all(na.omit(filter(flights,month==11 | month ==12)) == na.omit(filter(flights,month %in% c(11,12))))
## [1] TRUE

Podemos ver que o resultado foi o mesmo (tivemos que omitir os Na pois comparações com eles funcionam de maneira diferente).

Podemos lembrar das Leis de De Morgan para simplificar algumas buscas como por exemplo.

!(x & y ) == !x | !y e !(x|y) == !x & !y

Por exemplo, se quisessemos saber os voos que atrasaram menos de 2 horas para chegar ou para sair, poderiamos fazer assim.

filter(flights, !(arr_delay > 120 | dep_delay > 120))
## # A tibble: 316,050 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 316,040 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
filter(flights, arr_delay <= 120 & dep_delay <= 120)
## # A tibble: 316,050 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 316,040 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

5.2.3 Missing Values

Comparações com NA quase sempre retornam NA, por isso é melhor evita-las. is.na() teste se um valor é NA. Filters vão ignorar valores que são false e NA, se quiser preservar NA deve ser pedido separadamente.

df <- tibble(x=c(1,NA,3))
filter(df,x>1)
## # A tibble: 1 x 1
##       x
##   <dbl>
## 1     3
filter(df,x>1 | is.na(x))
## # A tibble: 2 x 1
##       x
##   <dbl>
## 1    NA
## 2     3

Exercícios 5.2.4

  1. Todos voos que atrasaram por 2 horas ou mais na chegada
filter(flights,arr_delay >= 120)
## # A tibble: 10,200 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      811            630       101     1047            830
##  2  2013     1     1      848           1835       853     1001           1950
##  3  2013     1     1      957            733       144     1056            853
##  4  2013     1     1     1114            900       134     1447           1222
##  5  2013     1     1     1505           1310       115     1638           1431
##  6  2013     1     1     1525           1340       105     1831           1626
##  7  2013     1     1     1549           1445        64     1912           1656
##  8  2013     1     1     1558           1359       119     1718           1515
##  9  2013     1     1     1732           1630        62     2028           1825
## 10  2013     1     1     1803           1620       103     2008           1750
## # ... with 10,190 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Foram para Houston (IAH ou HOU)
filter(flights,dest == 'IAH' | dest == 'HOU')
## # A tibble: 9,313 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      623            627        -4      933            932
##  4  2013     1     1      728            732        -4     1041           1038
##  5  2013     1     1      739            739         0     1104           1038
##  6  2013     1     1      908            908         0     1228           1219
##  7  2013     1     1     1028           1026         2     1350           1339
##  8  2013     1     1     1044           1045        -1     1352           1351
##  9  2013     1     1     1114            900       134     1447           1222
## 10  2013     1     1     1205           1200         5     1503           1505
## # ... with 9,303 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Voos operados por United, American ou Delta
filter(flights,carrier %in% c('AA','DL','UA'))
## # A tibble: 139,504 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      554            600        -6      812            837
##  5  2013     1     1      554            558        -4      740            728
##  6  2013     1     1      558            600        -2      753            745
##  7  2013     1     1      558            600        -2      924            917
##  8  2013     1     1      558            600        -2      923            937
##  9  2013     1     1      559            600        -1      941            910
## 10  2013     1     1      559            600        -1      854            902
## # ... with 139,494 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Saíram no Verão (Junho,Agosto e Setembro)
filter(flights,month >= 7 & month <= 9)
## # A tibble: 86,326 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     7     1        1           2029       212      236           2359
##  2  2013     7     1        2           2359         3      344            344
##  3  2013     7     1       29           2245       104      151              1
##  4  2013     7     1       43           2130       193      322             14
##  5  2013     7     1       44           2150       174      300            100
##  6  2013     7     1       46           2051       235      304           2358
##  7  2013     7     1       48           2001       287      308           2305
##  8  2013     7     1       58           2155       183      335             43
##  9  2013     7     1      100           2146       194      327             30
## 10  2013     7     1      100           2245       135      337            135
## # ... with 86,316 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Chegaram com 2 horas de atraso mas não saíram atrasados
filter(flights,dep_delay <= 0,arr_delay >= 120 )
## # A tibble: 29 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1    27     1419           1420        -1     1754           1550
##  2  2013    10     7     1350           1350         0     1736           1526
##  3  2013    10     7     1357           1359        -2     1858           1654
##  4  2013    10    16      657            700        -3     1258           1056
##  5  2013    11     1      658            700        -2     1329           1015
##  6  2013     3    18     1844           1847        -3       39           2219
##  7  2013     4    17     1635           1640        -5     2049           1845
##  8  2013     4    18      558            600        -2     1149            850
##  9  2013     4    18      655            700        -5     1213            950
## 10  2013     5    22     1827           1830        -3     2217           2010
## # ... with 19 more rows, and 11 more variables: arr_delay <dbl>, carrier <chr>,
## #   flight <int>, tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
## #   distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Saíram 1 hora atrasados mas chegaram menos de 30 minutos atrasados.
filter(flights,dep_delay > 60,arr_delay <= 30)
## # A tibble: 211 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     3     1850           1745        65     2148           2120
##  2  2013     1     3     1950           1845        65     2228           2227
##  3  2013     1     6     1019            900        79     1558           1530
##  4  2013     1     7     1543           1430        73     1758           1735
##  5  2013     1    12     1706           1600        66     1949           1927
##  6  2013     1    12     1953           1845        68     2154           2137
##  7  2013     1    19     1456           1355        61     1636           1615
##  8  2013     1    21     1531           1430        61     1843           1815
##  9  2013     1    21     1648           1545        63     1939           1910
## 10  2013    10     5     1605           1500        65     1857           1827
## # ... with 201 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Partiram entre Meia Noite e 6 da Manhã
filter(flights,dep_time >= 1 & dep_time <= 600)
## # A tibble: 9,344 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 9,334 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Usar between para simplificar o código anterior.
filter(flights, between(flights$dep_time,1,600))
## # A tibble: 9,344 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 9,334 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Quantos voos não tem informação sobre o horario de saída. Quais outras variáveis tem valor faltante.
colSums(is.na(flights))
##           year          month            day       dep_time sched_dep_time 
##              0              0              0           8255              0 
##      dep_delay       arr_time sched_arr_time      arr_delay        carrier 
##           8255           8713              0           9430              0 
##         flight        tailnum         origin           dest       air_time 
##              0           2512              0              0           9430 
##       distance           hour         minute      time_hour 
##              0              0              0              0

8255 observações não tem informações sobre os horarios de saída. Existem outra variáveis com dados faltantes, o que faz sentido dado que algumas informações podem só ter sido inferidas dessa e do arrival.

  1. Por que NA^0 é 1? Por que NA | True não é missing? Por que False & NA não é missing? Qual a regra geral?

Pois qualquer Número elevado a 0 vai ser 1.

Pois basta um True no Or para retornar True

Pois basta um dos valores ser False para pra retornar False.

Quando um resultado só possui uma possibilidade de resultado independente do número o retorno não é NA.

NA * 0 não é 0 pois 0 * 0 ^(-1) não é 0.

5.3 Arrange rows with arrange()

arrange ordena um dataframe baseado nos criterios escolhidos, passamos o data frame e depois os critérios que devem ser usados para essa ordenação, as variaveis subsequentes a uma anterior são usadas para desempatar o empate no valor anterior.

arrange(flights,year,month,day)
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Voos ordenados pelos que mais atrasaram no ano, em minutos

arrange(flights,desc(dep_delay))
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     9      641            900      1301     1242           1530
##  2  2013     6    15     1432           1935      1137     1607           2120
##  3  2013     1    10     1121           1635      1126     1239           1810
##  4  2013     9    20     1139           1845      1014     1457           2210
##  5  2013     7    22      845           1600      1005     1044           1815
##  6  2013     4    10     1100           1900       960     1342           2211
##  7  2013     3    17     2321            810       911      135           1020
##  8  2013     6    27      959           1900       899     1236           2226
##  9  2013     7    22     2257            759       898      121           1026
## 10  2013    12     5      756           1700       896     1058           2020
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Valores faltantes sempre são colocados no final. Exemplo:

flights %>% arrange(dep_time) %>% tail
## # A tibble: 6 x 19
##    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
## 1  2013     9    30       NA           1842        NA       NA           2019
## 2  2013     9    30       NA           1455        NA       NA           1634
## 3  2013     9    30       NA           2200        NA       NA           2312
## 4  2013     9    30       NA           1210        NA       NA           1330
## 5  2013     9    30       NA           1159        NA       NA           1344
## 6  2013     9    30       NA            840        NA       NA           1020
## # ... with 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, time_hour <dttm>
flights %>% arrange(desc(dep_time)) %>% tail
## # A tibble: 6 x 19
##    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
## 1  2013     9    30       NA           1842        NA       NA           2019
## 2  2013     9    30       NA           1455        NA       NA           1634
## 3  2013     9    30       NA           2200        NA       NA           2312
## 4  2013     9    30       NA           1210        NA       NA           1330
## 5  2013     9    30       NA           1159        NA       NA           1344
## 6  2013     9    30       NA            840        NA       NA           1020
## # ... with 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, time_hour <dttm>

Exercícios 5.3.1

  1. Ordenar com NA primeiro
arrange(flights,!is.na(dep_time),dep_time) # Poderia tambem apenas colocar desc para o primeiro argumento
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1       NA           1630        NA       NA           1815
##  2  2013     1     1       NA           1935        NA       NA           2240
##  3  2013     1     1       NA           1500        NA       NA           1825
##  4  2013     1     1       NA            600        NA       NA            901
##  5  2013     1     2       NA           1540        NA       NA           1747
##  6  2013     1     2       NA           1620        NA       NA           1746
##  7  2013     1     2       NA           1355        NA       NA           1459
##  8  2013     1     2       NA           1420        NA       NA           1644
##  9  2013     1     2       NA           1321        NA       NA           1536
## 10  2013     1     2       NA           1545        NA       NA           1910
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
arrange(flights,desc(is.na(dep_time)),dep_time)
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1       NA           1630        NA       NA           1815
##  2  2013     1     1       NA           1935        NA       NA           2240
##  3  2013     1     1       NA           1500        NA       NA           1825
##  4  2013     1     1       NA            600        NA       NA            901
##  5  2013     1     2       NA           1540        NA       NA           1747
##  6  2013     1     2       NA           1620        NA       NA           1746
##  7  2013     1     2       NA           1355        NA       NA           1459
##  8  2013     1     2       NA           1420        NA       NA           1644
##  9  2013     1     2       NA           1321        NA       NA           1536
## 10  2013     1     2       NA           1545        NA       NA           1910
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Ordenar para encontrar o mais atrasado e o mais adiantado na saída.
arrange(flights,desc(dep_delay)) # Atrasado
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     9      641            900      1301     1242           1530
##  2  2013     6    15     1432           1935      1137     1607           2120
##  3  2013     1    10     1121           1635      1126     1239           1810
##  4  2013     9    20     1139           1845      1014     1457           2210
##  5  2013     7    22      845           1600      1005     1044           1815
##  6  2013     4    10     1100           1900       960     1342           2211
##  7  2013     3    17     2321            810       911      135           1020
##  8  2013     6    27      959           1900       899     1236           2226
##  9  2013     7    22     2257            759       898      121           1026
## 10  2013    12     5      756           1700       896     1058           2020
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
arrange(flights,dep_delay) # Adiantado
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013    12     7     2040           2123       -43       40           2352
##  2  2013     2     3     2022           2055       -33     2240           2338
##  3  2013    11    10     1408           1440       -32     1549           1559
##  4  2013     1    11     1900           1930       -30     2233           2243
##  5  2013     1    29     1703           1730       -27     1947           1957
##  6  2013     8     9      729            755       -26     1002            955
##  7  2013    10    23     1907           1932       -25     2143           2143
##  8  2013     3    30     2030           2055       -25     2213           2250
##  9  2013     3     2     1431           1455       -24     1601           1631
## 10  2013     5     5      934            958       -24     1225           1309
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Voo mais veloz.
arrange(flights,desc(distance/air_time))
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     5    25     1709           1700         9     1923           1937
##  2  2013     7     2     1558           1513        45     1745           1719
##  3  2013     5    13     2040           2025        15     2225           2226
##  4  2013     3    23     1914           1910         4     2045           2043
##  5  2013     1    12     1559           1600        -1     1849           1917
##  6  2013    11    17      650            655        -5     1059           1150
##  7  2013     2    21     2355           2358        -3      412            438
##  8  2013    11    17      759            800        -1     1212           1255
##  9  2013    11    16     2003           1925        38       17             36
## 10  2013    11    16     2349           2359       -10      402            440
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Voos que foram mais longe, voos mais perto.
arrange(flights,desc(distance))
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      857            900        -3     1516           1530
##  2  2013     1     2      909            900         9     1525           1530
##  3  2013     1     3      914            900        14     1504           1530
##  4  2013     1     4      900            900         0     1516           1530
##  5  2013     1     5      858            900        -2     1519           1530
##  6  2013     1     6     1019            900        79     1558           1530
##  7  2013     1     7     1042            900       102     1620           1530
##  8  2013     1     8      901            900         1     1504           1530
##  9  2013     1     9      641            900      1301     1242           1530
## 10  2013     1    10      859            900        -1     1449           1530
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
arrange(flights,distance)
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     7    27       NA            106        NA       NA            245
##  2  2013     1     3     2127           2129        -2     2222           2224
##  3  2013     1     4     1240           1200        40     1333           1306
##  4  2013     1     4     1829           1615       134     1937           1721
##  5  2013     1     4     2128           2129        -1     2218           2224
##  6  2013     1     5     1155           1200        -5     1241           1306
##  7  2013     1     6     2125           2129        -4     2224           2224
##  8  2013     1     7     2124           2129        -5     2212           2224
##  9  2013     1     8     2127           2130        -3     2304           2225
## 10  2013     1     9     2126           2129        -3     2217           2224
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

5.4 Select columns with select()

Selecione apenas as variáveis de interesse de um dataset pelo seu nome. Se quisermos apenas a data, número do voo, companhia aérea e número do avião.

select(flights,year,month,day,carrier,flight,tailnum)
## # A tibble: 336,776 x 6
##     year month   day carrier flight tailnum
##    <int> <int> <int> <chr>    <int> <chr>  
##  1  2013     1     1 UA        1545 N14228 
##  2  2013     1     1 UA        1714 N24211 
##  3  2013     1     1 AA        1141 N619AA 
##  4  2013     1     1 B6         725 N804JB 
##  5  2013     1     1 DL         461 N668DN 
##  6  2013     1     1 UA        1696 N39463 
##  7  2013     1     1 B6         507 N516JB 
##  8  2013     1     1 EV        5708 N829AS 
##  9  2013     1     1 B6          79 N593JB 
## 10  2013     1     1 AA         301 N3ALAA 
## # ... with 336,766 more rows

Podemos selecionar todas as colunas entre duas colunas (inclusas).

select(flights,year:dep_time)
## # A tibble: 336,776 x 4
##     year month   day dep_time
##    <int> <int> <int>    <int>
##  1  2013     1     1      517
##  2  2013     1     1      533
##  3  2013     1     1      542
##  4  2013     1     1      544
##  5  2013     1     1      554
##  6  2013     1     1      554
##  7  2013     1     1      555
##  8  2013     1     1      557
##  9  2013     1     1      557
## 10  2013     1     1      558
## # ... with 336,766 more rows

Selecionar todas colunas menos algumas.

select(flights,-(year:dep_time))
## # A tibble: 336,776 x 15
##    sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight
##             <int>     <dbl>    <int>          <int>     <dbl> <chr>    <int>
##  1            515         2      830            819        11 UA        1545
##  2            529         4      850            830        20 UA        1714
##  3            540         2      923            850        33 AA        1141
##  4            545        -1     1004           1022       -18 B6         725
##  5            600        -6      812            837       -25 DL         461
##  6            558        -4      740            728        12 UA        1696
##  7            600        -5      913            854        19 B6         507
##  8            600        -3      709            723       -14 EV        5708
##  9            600        -3      838            846        -8 B6          79
## 10            600        -2      753            745         8 AA         301
## # ... with 336,766 more rows, and 8 more variables: tailnum <chr>,
## #   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
## #   minute <dbl>, time_hour <dttm>
select(flights,-c(year,month,day))
## # A tibble: 336,776 x 16
##    dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier
##       <int>          <int>     <dbl>    <int>          <int>     <dbl> <chr>  
##  1      517            515         2      830            819        11 UA     
##  2      533            529         4      850            830        20 UA     
##  3      542            540         2      923            850        33 AA     
##  4      544            545        -1     1004           1022       -18 B6     
##  5      554            600        -6      812            837       -25 DL     
##  6      554            558        -4      740            728        12 UA     
##  7      555            600        -5      913            854        19 B6     
##  8      557            600        -3      709            723       -14 EV     
##  9      557            600        -3      838            846        -8 B6     
## 10      558            600        -2      753            745         8 AA     
## # ... with 336,766 more rows, and 9 more variables: flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, time_hour <dttm>

Existem varias funções auxiliares para serem usadas com select.

starts_with(“abc”): matches names that begin with “abc”.

ends_with(“xyz”): matches names that end with “xyz”.

contains(“ijk”): matches names that contain “ijk”.

matches(“(.)\1”): selects variables that match a regular expression. This one matches any variables that contain repeated characters. You’ll learn more about regular expressions in strings.

num_range(“x”, 1:3): matches x1, x2 and x3.

select(flights,starts_with('arr')) # O mesmo padrão serve para os outros
## # A tibble: 336,776 x 2
##    arr_time arr_delay
##       <int>     <dbl>
##  1      830        11
##  2      850        20
##  3      923        33
##  4     1004       -18
##  5      812       -25
##  6      740        12
##  7      913        19
##  8      709       -14
##  9      838        -8
## 10      753         8
## # ... with 336,766 more rows

Select pode ser usado para renomear variáveis, mas pelo fato de não manter as variáveis não escolhidas, faz mais sentido usar rename() na maioria das situações

select(flights,ano = year)
## # A tibble: 336,776 x 1
##      ano
##    <int>
##  1  2013
##  2  2013
##  3  2013
##  4  2013
##  5  2013
##  6  2013
##  7  2013
##  8  2013
##  9  2013
## 10  2013
## # ... with 336,766 more rows
rename(flights,ano=year)
## # A tibble: 336,776 x 19
##      ano month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Usar select em conjunto com everything se quiser colocar apenas algumas colunas na primeira posição.

select(flights,origin,dest,everything())
## # A tibble: 336,776 x 19
##    origin dest   year month   day dep_time sched_dep_time dep_delay arr_time
##    <chr>  <chr> <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1 EWR    IAH    2013     1     1      517            515         2      830
##  2 LGA    IAH    2013     1     1      533            529         4      850
##  3 JFK    MIA    2013     1     1      542            540         2      923
##  4 JFK    BQN    2013     1     1      544            545        -1     1004
##  5 LGA    ATL    2013     1     1      554            600        -6      812
##  6 EWR    ORD    2013     1     1      554            558        -4      740
##  7 EWR    FLL    2013     1     1      555            600        -5      913
##  8 LGA    IAD    2013     1     1      557            600        -3      709
##  9 JFK    MCO    2013     1     1      557            600        -3      838
## 10 LGA    ORD    2013     1     1      558            600        -2      753
## # ... with 336,766 more rows, and 10 more variables: sched_arr_time <int>,
## #   arr_delay <dbl>, carrier <chr>, flight <int>, tailnum <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Exercícios 5.4.1

  1. Fazer de variás maneiras diferentes a seleção de dep_time, dep_delay, arr_time, e arr_delay
select(flights,dep_time,dep_delay,arr_time,arr_delay)
## # A tibble: 336,776 x 4
##    dep_time dep_delay arr_time arr_delay
##       <int>     <dbl>    <int>     <dbl>
##  1      517         2      830        11
##  2      533         4      850        20
##  3      542         2      923        33
##  4      544        -1     1004       -18
##  5      554        -6      812       -25
##  6      554        -4      740        12
##  7      555        -5      913        19
##  8      557        -3      709       -14
##  9      557        -3      838        -8
## 10      558        -2      753         8
## # ... with 336,766 more rows
select(flights,dep_time:arr_delay,-starts_with('sched'))
## # A tibble: 336,776 x 4
##    dep_time dep_delay arr_time arr_delay
##       <int>     <dbl>    <int>     <dbl>
##  1      517         2      830        11
##  2      533         4      850        20
##  3      542         2      923        33
##  4      544        -1     1004       -18
##  5      554        -6      812       -25
##  6      554        -4      740        12
##  7      555        -5      913        19
##  8      557        -3      709       -14
##  9      557        -3      838        -8
## 10      558        -2      753         8
## # ... with 336,766 more rows
select(flights,contains(c('arr_','dep_')),-contains('sched'))
## # A tibble: 336,776 x 4
##    arr_time arr_delay dep_time dep_delay
##       <int>     <dbl>    <int>     <dbl>
##  1      830        11      517         2
##  2      850        20      533         4
##  3      923        33      542         2
##  4     1004       -18      544        -1
##  5      812       -25      554        -6
##  6      740        12      554        -4
##  7      913        19      555        -5
##  8      709       -14      557        -3
##  9      838        -8      557        -3
## 10      753         8      558        -2
## # ... with 336,766 more rows
# Podemos listar todos que não queremos.

select(flights,dep_time:arr_delay)[c(1,3,4,6)]
## # A tibble: 336,776 x 4
##    dep_time dep_delay arr_time arr_delay
##       <int>     <dbl>    <int>     <dbl>
##  1      517         2      830        11
##  2      533         4      850        20
##  3      542         2      923        33
##  4      544        -1     1004       -18
##  5      554        -6      812       -25
##  6      554        -4      740        12
##  7      555        -5      913        19
##  8      557        -3      709       -14
##  9      557        -3      838        -8
## 10      558        -2      753         8
## # ... with 336,766 more rows
flights[c(4,6,7,9)]
## # A tibble: 336,776 x 4
##    dep_time dep_delay arr_time arr_delay
##       <int>     <dbl>    <int>     <dbl>
##  1      517         2      830        11
##  2      533         4      850        20
##  3      542         2      923        33
##  4      544        -1     1004       -18
##  5      554        -6      812       -25
##  6      554        -4      740        12
##  7      555        -5      913        19
##  8      557        -3      709       -14
##  9      557        -3      838        -8
## 10      558        -2      753         8
## # ... with 336,766 more rows
  1. O que acontece se chamamos uma variável duas vezes no select?
select(flights,year,carrier,year) # Apenas uma vez é retornada (Na posição da primeira)
## # A tibble: 336,776 x 2
##     year carrier
##    <int> <chr>  
##  1  2013 UA     
##  2  2013 UA     
##  3  2013 AA     
##  4  2013 B6     
##  5  2013 DL     
##  6  2013 UA     
##  7  2013 B6     
##  8  2013 EV     
##  9  2013 B6     
## 10  2013 AA     
## # ... with 336,766 more rows
  1. O que any_of() faz?
vars <- c("year", "month", "day", "dep_delay", "arr_delay") 

select(flights,any_of(vars))
## # A tibble: 336,776 x 5
##     year month   day dep_delay arr_delay
##    <int> <int> <int>     <dbl>     <dbl>
##  1  2013     1     1         2        11
##  2  2013     1     1         4        20
##  3  2013     1     1         2        33
##  4  2013     1     1        -1       -18
##  5  2013     1     1        -6       -25
##  6  2013     1     1        -4        12
##  7  2013     1     1        -5        19
##  8  2013     1     1        -3       -14
##  9  2013     1     1        -3        -8
## 10  2013     1     1        -2         8
## # ... with 336,766 more rows

Serve para ajudar na seleção com vetores de caracteres externos, seleciona todas colunas que o nome aparece no vetor, caso um nome do vetor não apareça no df, esse nome apenas é descartado e os outros ainda são selecionados. all_of é parecida mas se um dos nomes do vetor não está no df, retorna erro e nada é selecionado.

select(flights,contains('TIME'))
## # A tibble: 336,776 x 6
##    dep_time sched_dep_time arr_time sched_arr_time air_time time_hour          
##       <int>          <int>    <int>          <int>    <dbl> <dttm>             
##  1      517            515      830            819      227 2013-01-01 05:00:00
##  2      533            529      850            830      227 2013-01-01 05:00:00
##  3      542            540      923            850      160 2013-01-01 05:00:00
##  4      544            545     1004           1022      183 2013-01-01 05:00:00
##  5      554            600      812            837      116 2013-01-01 06:00:00
##  6      554            558      740            728      150 2013-01-01 05:00:00
##  7      555            600      913            854      158 2013-01-01 06:00:00
##  8      557            600      709            723       53 2013-01-01 06:00:00
##  9      557            600      838            846      140 2013-01-01 06:00:00
## 10      558            600      753            745      138 2013-01-01 06:00:00
## # ... with 336,766 more rows

O resultado me surpreende pois letras maiúsculas e minúsculas foram interpretadas igualmente ao procurar. A starts_with , ends_with , contains e matches contem o argumento ignore.case que como é default é TRUE, ele faz com que não haja distinção entre maiúsculas e minúsculas. Podemos alterer isso.

select(flights,contains('TIME',ignore.case = FALSE)) # Nenhuma coluna encontrada
## # A tibble: 336,776 x 0

5.5 Add new Variables with Mutate

Mutate adiciona novas colunas ao final do Dataset, para facilitar a visualização, vamos criar um dataset reduzido para trabalhar

flights_aux <- select(flights,year:day,ends_with('delay'),distance,air_time)
mutate(flights_aux,gain = dep_delay - arr_delay, speed = distance/air_time * 60)
## # A tibble: 336,776 x 9
##     year month   day dep_delay arr_delay distance air_time  gain speed
##    <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl> <dbl> <dbl>
##  1  2013     1     1         2        11     1400      227    -9  370.
##  2  2013     1     1         4        20     1416      227   -16  374.
##  3  2013     1     1         2        33     1089      160   -31  408.
##  4  2013     1     1        -1       -18     1576      183    17  517.
##  5  2013     1     1        -6       -25      762      116    19  394.
##  6  2013     1     1        -4        12      719      150   -16  288.
##  7  2013     1     1        -5        19     1065      158   -24  404.
##  8  2013     1     1        -3       -14      229       53    11  259.
##  9  2013     1     1        -3        -8      944      140     5  405.
## 10  2013     1     1        -2         8      733      138   -10  319.
## # ... with 336,766 more rows

Podemos criar outras variáveis a partir das já existente, lembre que assim como as outras funções,o data frame não foi alterado, o optput é um novo conjunto que caso desejado deve ser salvo em uma variável.

No uso da função é possivel se referir em colunas que acabaram de ser criadas.

mutate(flights_aux,
       gain = dep_delay - arr_delay, 
       hours = air_time / 60,
       gain_per_hour = gain/hours)
## # A tibble: 336,776 x 10
##     year month   day dep_delay arr_delay distance air_time  gain hours
##    <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl> <dbl> <dbl>
##  1  2013     1     1         2        11     1400      227    -9 3.78 
##  2  2013     1     1         4        20     1416      227   -16 3.78 
##  3  2013     1     1         2        33     1089      160   -31 2.67 
##  4  2013     1     1        -1       -18     1576      183    17 3.05 
##  5  2013     1     1        -6       -25      762      116    19 1.93 
##  6  2013     1     1        -4        12      719      150   -16 2.5  
##  7  2013     1     1        -5        19     1065      158   -24 2.63 
##  8  2013     1     1        -3       -14      229       53    11 0.883
##  9  2013     1     1        -3        -8      944      140     5 2.33 
## 10  2013     1     1        -2         8      733      138   -10 2.3  
## # ... with 336,766 more rows, and 1 more variable: gain_per_hour <dbl>

Se o seu objetivo é manter apenas asnovas variáveis, deve usar transmute

transmute(flights_aux,
       gain = dep_delay - arr_delay, 
       hours = air_time / 60,
       gain_per_hour = gain/hours)
## # A tibble: 336,776 x 3
##     gain hours gain_per_hour
##    <dbl> <dbl>         <dbl>
##  1    -9 3.78          -2.38
##  2   -16 3.78          -4.23
##  3   -31 2.67         -11.6 
##  4    17 3.05           5.57
##  5    19 1.93           9.83
##  6   -16 2.5           -6.4 
##  7   -24 2.63          -9.11
##  8    11 0.883         12.5 
##  9     5 2.33           2.14
## 10   -10 2.3           -4.35
## # ... with 336,766 more rows

5.5.1 Useful Creation Functions

Existem várias funções que podem ser usadas em conjunto com mutate, a condição é que elas possam receber um vetor como input e um vetor com mesmo tamanho de output. Exemplos:

  • Operadores Aritiméticos: + - * / ^

  • Modulares Aritiméticos: %/% (Divisão por Inteiro) %% (Resto)

Modulares são utéis para dividir inteiros, por exeplo:

transmute(flights,dep_time,horas = dep_time %/% 100, minutos = dep_time %% 100)
## # A tibble: 336,776 x 3
##    dep_time horas minutos
##       <int> <dbl>   <dbl>
##  1      517     5      17
##  2      533     5      33
##  3      542     5      42
##  4      544     5      44
##  5      554     5      54
##  6      554     5      54
##  7      555     5      55
##  8      557     5      57
##  9      557     5      57
## 10      558     5      58
## # ... with 336,766 more rows
  • Logs são utéis para dados em diversas ordens de grandeza.

  • lead e lag premite que sejam comparados os valores com seu antterior ou próximo, útil para analisar quando um valor muda em séries temporais, etc. Podemos aplicar com mutate para criar novos dados.

x <- c(1,1,1,1,2,3,4,4,4,4,4,5,5,5,5,5); lag(x)
##  [1] NA  1  1  1  1  2  3  4  4  4  4  4  5  5  5  5
x - lag(x) # 'Empurra' os valores para frente
##  [1] NA  0  0  0  1  1  1  0  0  0  0  1  0  0  0  0
x - lead(x) # 'Puxa' os valore para trás
##  [1]  0  0  0 -1 -1 -1  0  0  0  0 -1  0  0  0  0 NA
  • Somas, produtos, min, max e medias cumulativas podem ser feitas e usadas em conjunto com mutate. Ex:
dados <- tibble(x = c(1,2,3,4,5,6,7,8,9))

mutate(dados,somacumulativa = cumsum(x),produtocum = cumprod(x),mincum = cummin(x),maxcum= cummax(x),mediacumulativa = cummean(x))  # Nesse caso o produto ficou com o mesmo valor do fatorial por serem todos numeros a partir do 0 em sequência.
## # A tibble: 9 x 6
##       x somacumulativa produtocum mincum maxcum mediacumulativa
##   <dbl>          <dbl>      <dbl>  <dbl>  <dbl>           <dbl>
## 1     1              1          1      1      1             1  
## 2     2              3          2      1      2             1.5
## 3     3              6          6      1      3             2  
## 4     4             10         24      1      4             2.5
## 5     5             15        120      1      5             3  
## 6     6             21        720      1      6             3.5
## 7     7             28       5040      1      7             4  
## 8     8             36      40320      1      8             4.5
## 9     9             45     362880      1      9             5
  • Operadoções lógicas. Pode ser útil salvar um valor lógico quando estamos fazendo operações lógicas complexas para acompanhas cada estágio.
transmute(flights_aux,distancia_maior_1000 = distance >1000)
## # A tibble: 336,776 x 1
##    distancia_maior_1000
##    <lgl>               
##  1 TRUE                
##  2 TRUE                
##  3 TRUE                
##  4 TRUE                
##  5 FALSE               
##  6 FALSE               
##  7 TRUE                
##  8 FALSE               
##  9 FALSE               
## 10 FALSE               
## # ... with 336,766 more rows
  • Ranqueando : Existem diversas funções para ranquear mas podemos apresentar min_rank(), que atribui rank menor aos menores valores, para inverter devemos usar desc(x)
transmute(flights_aux,distance,rankdist = min_rank(distance)) %>% arrange(distance)
## # A tibble: 336,776 x 2
##    distance rankdist
##       <dbl>    <int>
##  1       17        1
##  2       80        2
##  3       80        2
##  4       80        2
##  5       80        2
##  6       80        2
##  7       80        2
##  8       80        2
##  9       80        2
## 10       80        2
## # ... with 336,766 more rows
transmute(flights,distance,rankdist= min_rank(desc(distance))) %>% arrange(desc(distance))
## # A tibble: 336,776 x 2
##    distance rankdist
##       <dbl>    <int>
##  1     4983        1
##  2     4983        1
##  3     4983        1
##  4     4983        1
##  5     4983        1
##  6     4983        1
##  7     4983        1
##  8     4983        1
##  9     4983        1
## 10     4983        1
## # ... with 336,766 more rows

Caso min rank não seja o desejado existem outras opções, apresentadas a seguir:

y <- c(1,2,2,NA,3,4)

min_rank(y)
## [1]  1  2  2 NA  4  5
row_number(y)
## [1]  1  2  3 NA  4  5
dense_rank(y)
## [1]  1  2  2 NA  3  4
percent_rank(y)
## [1] 0.00 0.25 0.25   NA 0.75 1.00
cume_dist(y)
## [1] 0.2 0.6 0.6  NA 0.8 1.0

Exercícios 5.2.2

  1. dep time e sched dep time são convenientes para olhar mas não são bons para fazer contas, convertelos em para representações em minutos desde meia noite.
transmute(flights,dep_time,sched_dep_time,
          minutos_dep= dep_time %/% 100 *60 + dep_time %%100 ,
          minutos_dep_programado = sched_dep_time %/% 100 *60 + sched_dep_time %%100)
## # A tibble: 336,776 x 4
##    dep_time sched_dep_time minutos_dep minutos_dep_programado
##       <int>          <int>       <dbl>                  <dbl>
##  1      517            515         317                    315
##  2      533            529         333                    329
##  3      542            540         342                    340
##  4      544            545         344                    345
##  5      554            600         354                    360
##  6      554            558         354                    358
##  7      555            600         355                    360
##  8      557            600         357                    360
##  9      557            600         357                    360
## 10      558            600         358                    360
## # ... with 336,766 more rows
  1. Quando comparamos air_time com arr_time - dep_time o esperado seria uma igualdade, mas por estar salvo em um formato para visualização e não contas devemos alterar para coincindir.
transmute(flights,dep_time,arr_time,air_time,time_errado = arr_time-dep_time)
## # A tibble: 336,776 x 4
##    dep_time arr_time air_time time_errado
##       <int>    <int>    <dbl>       <int>
##  1      517      830      227         313
##  2      533      850      227         317
##  3      542      923      160         381
##  4      544     1004      183         460
##  5      554      812      116         258
##  6      554      740      150         186
##  7      555      913      158         358
##  8      557      709       53         152
##  9      557      838      140         281
## 10      558      753      138         195
## # ... with 336,766 more rows

Os resultados são diferentes pois os horarios estão em formados errados, para consertar temos que converter os horarios em minutos, isso funcionara para todos dados menos os que chegaram um dia depois, para computar esses casos teriamos que assumir um dia arbitrario com valor 0 para ser o começo do contador desse banco de dados e fazer a conta com isso (sabendo o dia de saida e de chegada do voo). Além disso voos que mudarem de fuso horarios tambem terão valores errados. Mas vale ser feito mesmo assim.

transmute(flights %>% filter(arr_time >600),
          dep_time,
          arr_time,
          dep_time2= dep_time %/% 100 *60 + dep_time %%100,
          arr_time2 =  arr_time %/% 100 *60 + arr_time %%100,
          air_time, air_time_calc = arr_time2 - dep_time2) 
## # A tibble: 316,283 x 6
##    dep_time arr_time dep_time2 arr_time2 air_time air_time_calc
##       <int>    <int>     <dbl>     <dbl>    <dbl>         <dbl>
##  1      517      830       317       510      227           193
##  2      533      850       333       530      227           197
##  3      542      923       342       563      160           221
##  4      544     1004       344       604      183           260
##  5      554      812       354       492      116           138
##  6      554      740       354       460      150           106
##  7      555      913       355       553      158           198
##  8      557      709       357       429       53            72
##  9      557      838       357       518      140           161
## 10      558      753       358       473      138           115
## # ... with 316,273 more rows

O método seria esse, porem o air time é calculado apenas como tempo voando mesmo, enquanto o departure e arrival, o tempo de saída e chegada considerando a abertura e fechamento das portas, dessa maneira precisariamos das variaveis de tempo que o aviao ficou parado e taxiou para calcular corretamente.

  1. Comparar dep_time, sched_dep_time e dep_delay. O que se espera é que dep_delay = dep_time - sched_dep_time
transmute(flights,
          saida_real_min= dep_time %/% 100 *60 + dep_time %%100,
          saida_plan_min= sched_dep_time %/% 100 *60 + sched_dep_time %%100,
          dep_delay,
          delay_calc = saida_real_min - saida_plan_min)
## # A tibble: 336,776 x 4
##    saida_real_min saida_plan_min dep_delay delay_calc
##             <dbl>          <dbl>     <dbl>      <dbl>
##  1            317            315         2          2
##  2            333            329         4          4
##  3            342            340         2          2
##  4            344            345        -1         -1
##  5            354            360        -6         -6
##  6            354            358        -4         -4
##  7            355            360        -5         -5
##  8            357            360        -3         -3
##  9            357            360        -3         -3
## 10            358            360        -2         -2
## # ... with 336,766 more rows

Fazendo os ajustes corretos o horarío sai corretamente.

  1. Encontrar e rankear os 10 voos mais atrasados. Em caso de empate colocar no mesmo rank e o proximo diferente pula o numero de observaçoes empatadas. min_rank usa esse padrão.
transmute(flights,dep_delay,rk = min_rank(desc(dep_delay))) %>% filter(rk <= 10) %>% arrange(rk)
## # A tibble: 10 x 2
##    dep_delay    rk
##        <dbl> <int>
##  1      1301     1
##  2      1137     2
##  3      1126     3
##  4      1014     4
##  5      1005     5
##  6       960     6
##  7       911     7
##  8       899     8
##  9       898     9
## 10       896    10
  1. O que 1:3 + 1:10 retorna? Explique.
Retorna erro pois operações entre vetores, devem conter vetores de comprimento igual.
  1. Quais funções trigonometricas são fornecidas pelo r?
O R fornece seno, cosseno, tangente, arccosseno, arcseno e arctangente. Essas são as principais, porem mais são fornecidas e muitas outras provavelmente podem ser encontradas por meio de pacotes.

5.6 Grouped summaries with summarise()

A ultima função principal é summarise(), ela condensa o dataframe em apenas uma linha:

summarise(flights,delay=mean(dep_delay,na.rm=T))
## # A tibble: 1 x 1
##   delay
##   <dbl>
## 1  12.6

Média de atraso dos voos.

Fica muito mais útil quando combinado com group.by(). Muda a análise do dataset inteiro para grupos, dessa forma quando usamos os verbos do dplyr nos datasets agrupados essas funções automaticamente se aplicaram em cada grupo.

groupb <- group_by(flights,year,month,day)

summarise(groupb,delay=mean(dep_delay,na.rm=T))
## `summarise()` has grouped output by 'year', 'month'. You can override using the `.groups` argument.
## # A tibble: 365 x 4
## # Groups:   year, month [12]
##     year month   day delay
##    <int> <int> <int> <dbl>
##  1  2013     1     1 11.5 
##  2  2013     1     2 13.9 
##  3  2013     1     3 11.0 
##  4  2013     1     4  8.95
##  5  2013     1     5  5.73
##  6  2013     1     6  7.15
##  7  2013     1     7  5.42
##  8  2013     1     8  2.55
##  9  2013     1     9  2.28
## 10  2013     1    10  2.84
## # ... with 355 more rows

Combinadas, essas duas funções geram funções que são extremamente usadas com o dplyr. grouped summaries.

5.6.1 Combining Multiple Operators with Pipe

Vamos supor que você deseja ver a relação entre a distancia do voo e o tempo de médio de atraso. Um código assim funcionaria.

grupo <- group_by(flights,dest)

delay <- summarise(grupo,
                   count = n(), # n() fornece o tamanho do grupo atual
                   dist = mean(distance,na.rm=T),
                   delay = mean(arr_delay,na.rm=T))

delay <- filter(delay,count > 20,dest != 'HNL') # Estamos removendo Honolulu devido a grande distância

graf <- ggplot(delay,aes(dist,delay)) + geom_point(aes(size=count,tooltip=dest),alpha=1/3) + geom_smooth(se= F)
ggplotly(graf)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

O código tem 3 passos , Primeiro o agrupamento dados, depois a sumarização dos dados, por último um filtro para remover os locais que tinham poucos poucos voos e remover Honolulu que tem o dobro da distancia dos outros aeroportos. Esse código tem a inconveniência de ter que nomear variáveis intermediarias que não são necessarias.

Agora usaremos o operador pipe %>% para fazer o mesmo processo.

delays <- flights %>% group_by(dest) %>% 
  summarise(count=n(),dist = mean(distance,na.rm = T),delay = mean(arr_delay,na.rm=T)) %>% 
  filter(count>20,dest != 'HNL')

delays
## # A tibble: 96 x 4
##    dest  count  dist delay
##    <chr> <int> <dbl> <dbl>
##  1 ABQ     254 1826   4.38
##  2 ACK     265  199   4.85
##  3 ALB     439  143  14.4 
##  4 ATL   17215  757. 11.3 
##  5 AUS    2439 1514.  6.02
##  6 AVL     275  584.  8.00
##  7 BDL     443  116   7.05
##  8 BGR     375  378   8.03
##  9 BHM     297  866. 16.9 
## 10 BNA    6333  758. 11.8 
## # ... with 86 more rows

Isso torna o código mais legível, voce pode fazer uma leitura em forma de verbos imperativos e com o pipe sendo um então. Selecione o df flights então agrupe baseado no destino, agora tire a distancia media e delay médio de cada grupo, agora remova os grupos menores que 20 e honolulu.

5.6.2 Missing Values

Valores missing em um conjunto de dados, quando são somados retornam missing, dessa maneira em operações de agregação é necessário fornecer o argumento na.rm para remover esses valores antes da conta.

sum(c(NA,2,3,4,5,6,7)); mean(c(NA,3,4,5,6,7))
## [1] NA
## [1] NA
sum(c(NA,2,3,4,5,6,7),na.rm=T); mean(c(NA,3,4,5,6,7),na.rm=T)
## [1] 27
## [1] 5

Podemos filtrar um dataset com os voos que não foram cancelados por exemplo

naocancelados <- flights %>% filter(!is.na(dep_delay) & !is.na(arr_delay))

naocancelados %>% group_by(dest) %>% summarise(count=n(),dist=mean(dep_delay),delay=mean(arr_delay))
## # A tibble: 104 x 4
##    dest  count  dist delay
##    <chr> <int> <dbl> <dbl>
##  1 ABQ     254 13.7   4.38
##  2 ACK     264  6.45  4.85
##  3 ALB     418 23.4  14.4 
##  4 ANC       8 12.9  -2.5 
##  5 ATL   16837 12.4  11.3 
##  6 AUS    2411 13.0   6.02
##  7 AVL     261  8.15  8.00
##  8 BDL     412 17.7   7.05
##  9 BGR     358 19.2   8.03
## 10 BHM     269 29.0  16.9 
## # ... with 94 more rows

5.6.3 Counts

Quando uma agregação é feita, é bom salvar uma variável com a contagem de observações no grupo ou a contagem de observações não vazias no grupo, dessa maneira saberemos o tamanho amostral e teremos noção do tamanho amostral. Por exemplo, vamos analisar os aviões baseado no numero da cauda que tem os maiores atrasos.

delays <- naocancelados %>% group_by(tailnum) %>% summarise(delay=mean(arr_delay))

ggplot(delays,aes(delay)) + geom_freqpoly(binwidth=10)

Parece que existem alguns aviões que tem tempo médio de atraso de 300 min, mas existem mais coisas por tras disso, se fizemos um gráfico de dispersão de tempo de atraso por número de voos:

delays <- naocancelados %>% group_by(tailnum) %>% summarise(delay=mean(arr_delay),n=n())

ggplot(delays) + geom_point(aes(x=n,y=delay),alpha=1/10)

Podemos perceber que os únicos aviões que tem um tempo médio de atraso muito alto são os que voaram poucas vezes.

5.6.4 Useful Summary functions

Pode ser útil combinar agregações com subsets lógicos. Temos a média de atrasos de todos os voos na primeira variável e a média de atraso somente dos voos que atrasaram na segunda variável.

naocancelados %>% group_by(year,month,day)  %>% 
  summarise(avg_delay = mean(arr_delay),avg_delay_pos = mean(arr_delay[arr_delay > 0]))
## `summarise()` has grouped output by 'year', 'month'. You can override using the `.groups` argument.
## # A tibble: 365 x 5
## # Groups:   year, month [12]
##     year month   day avg_delay avg_delay_pos
##    <int> <int> <int>     <dbl>         <dbl>
##  1  2013     1     1    12.7            32.5
##  2  2013     1     2    12.7            32.0
##  3  2013     1     3     5.73           27.7
##  4  2013     1     4    -1.93           28.3
##  5  2013     1     5    -1.53           22.6
##  6  2013     1     6     4.24           24.4
##  7  2013     1     7    -4.95           27.8
##  8  2013     1     8    -3.23           20.8
##  9  2013     1     9    -0.264          25.6
## 10  2013     1    10    -5.90           27.3
## # ... with 355 more rows
  • Medidas de Dispersão. sd() = Desvio Padrão IQR() = Variação interquartilica. mad() = Desvio Absoluto Médio pode ser mais útil na presença de outliers.
naocancelados %>% group_by(carrier) %>% summarise(n = n(),media_atr = mean(dep_delay),desvio_atraso = sd(dep_delay)) %>% arrange(media_atr)
## # A tibble: 16 x 4
##    carrier     n media_atr desvio_atraso
##    <chr>   <int>     <dbl>         <dbl>
##  1 US      19831      3.74          27.9
##  2 HA        342      4.90          74.1
##  3 AS        709      5.83          31.4
##  4 AA      31947      8.57          37.4
##  5 DL      47658      9.22          39.7
##  6 MQ      25037     10.4           39.0
##  7 UA      57782     12.0           35.5
##  8 OO         29     12.6           43.1
##  9 VX       5116     12.8           44.0
## 10 B6      54049     13.0           38.4
## 11 9E      17294     16.4           45.5
## 12 WN      12044     17.7           43.2
## 13 FL       3175     18.6           52.5
## 14 YV        544     18.9           49.2
## 15 EV      51108     19.8           46.4
## 16 F9        681     20.2           58.4
  • Medidas de Rank: Min() , Quantile(x,0.25), Max()
naocancelados %>% group_by(hour) %>% summarise(n=n(),atr_men_75 = quantile(dep_delay,0.75),atr_max = max(dep_delay)) %>% arrange(hour)
## # A tibble: 19 x 4
##     hour     n atr_men_75 atr_max
##    <dbl> <int>      <dbl>   <dbl>
##  1     5  1940          1     201
##  2     6 25447          0     786
##  3     7 22475          0     898
##  4     8 26734          1     911
##  5     9 19931          1    1301
##  6    10 16370          3     788
##  7    11 15689          4     437
##  8    12 17744          7     636
##  9    13 19457         11     533
## 10    14 21022         13     602
## 11    15 23082         18     483
## 12    16 22045         21    1126
## 13    17 23667         23     896
## 14    18 21072         25    1014
## 15    19 20507         32    1137
## 16    20 16061         34     878
## 17    21 10503         37     800
## 18    22  2558         27     276
## 19    23  1042         17     245

75% dos aviões não atrasam as 6 e 7 da manhã, e no geral os horarios de manhã tem menos aviões atrasados, enquanto 25% dos voos atrasam mais que meia hora as 19 horas da noite.

  • Mediadas de Posição , first(x) , nth(x,posiçao) , last(x). Funcionam similarmente a x[1],x[posição], x[lenght(x)]. Podemos selecionar a primeira e ultima saída de cada dia.
naocancelados %>% group_by(year,month,day) %>% summarise(primeiro = first(dep_time),ultimo = last(dep_time))
## `summarise()` has grouped output by 'year', 'month'. You can override using the `.groups` argument.
## # A tibble: 365 x 5
## # Groups:   year, month [12]
##     year month   day primeiro ultimo
##    <int> <int> <int>    <int>  <int>
##  1  2013     1     1      517   2356
##  2  2013     1     2       42   2354
##  3  2013     1     3       32   2349
##  4  2013     1     4       25   2358
##  5  2013     1     5       14   2357
##  6  2013     1     6       16   2355
##  7  2013     1     7       49   2359
##  8  2013     1     8      454   2351
##  9  2013     1     9        2   2252
## 10  2013     1    10        3   2320
## # ... with 355 more rows

Podem ser usadas de maneira complementar com filtros e ranks. Para filtrar com todas variáveis e a observação completa em cada linha.

naocancelados %>% group_by(year,month,day) %>% mutate(r = min_rank(desc(dep_time))) %>% filter(r %in% range(r))
## # A tibble: 770 x 20
## # Groups:   year, month, day [365]
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1     2356           2359        -3      425            437
##  3  2013     1     2       42           2359        43      518            442
##  4  2013     1     2     2354           2359        -5      413            437
##  5  2013     1     3       32           2359        33      504            442
##  6  2013     1     3     2349           2359       -10      434            445
##  7  2013     1     4       25           2359        26      505            442
##  8  2013     1     4     2358           2359        -1      429            437
##  9  2013     1     4     2358           2359        -1      436            445
## 10  2013     1     5       14           2359        15      503            445
## # ... with 760 more rows, and 12 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>,
## #   r <int>

r contem o rank de cada voo pelo horario, se filtramos apenas onde r = 1 e r = max(r) (por meio de range) temos o primeiro e último voo.

  • Counts: Além do n() que retorna o tamanho do grupo podemos olhar a quantidade de dados não faltantes no grupo. Podemos tambem contar a quantidade de observações distintas = n_distinct().
naocancelados %>% group_by(dest) %>% summarise(carriers = n_distinct(carrier),voos = n()) %>% arrange(desc(carriers))
## # A tibble: 104 x 3
##    dest  carriers  voos
##    <chr>    <int> <int>
##  1 ATL          7 16837
##  2 BOS          7 15022
##  3 CLT          7 13674
##  4 ORD          7 16566
##  5 TPA          7  7390
##  6 AUS          6  2411
##  7 DCA          6  9111
##  8 DTW          6  9031
##  9 IAD          6  5383
## 10 MSP          6  6929
## # ... with 94 more rows

Existem diversos locais que apenas uma companhia aérea leva e diversos que varias levam.

O dplyr fornece um simplificador se tudo que deseja são counts.

naocancelados %>% count(carrier)
## # A tibble: 16 x 2
##    carrier     n
##    <chr>   <int>
##  1 9E      17294
##  2 AA      31947
##  3 AS        709
##  4 B6      54049
##  5 DL      47658
##  6 EV      51108
##  7 F9        681
##  8 FL       3175
##  9 HA        342
## 10 MQ      25037
## 11 OO         29
## 12 UA      57782
## 13 US      19831
## 14 VX       5116
## 15 WN      12044
## 16 YV        544

Voce pode ainda fornecer uma variável peso. Poderia usar isso para medir a quantidade de milhas que um avião voou.

naocancelados %>% count(tailnum,wt=distance)
## # A tibble: 4,037 x 2
##    tailnum      n
##    <chr>    <dbl>
##  1 D942DN    3418
##  2 N0EGMQ  239143
##  3 N10156  109664
##  4 N102UW   25722
##  5 N103US   24619
##  6 N104UW   24616
##  7 N10575  139903
##  8 N105UW   23618
##  9 N107US   21677
## 10 N108UW   32070
## # ... with 4,027 more rows

Counts and Proportion of Logical Values: Podemos usar sums e means sobre vetores logicos para obter a quantidade e proporção em que a condição é atendida dado que TRUE = 1 e FALSE = 0

naocancelados %>% group_by(carrier) %>% summarise(voos= n(),atrasadostotal = sum(arr_delay >0),percentualatrasados = mean(arr_delay >0)) %>% arrange(percentualatrasados)
## # A tibble: 16 x 4
##    carrier  voos atrasadostotal percentualatrasados
##    <chr>   <int>          <int>               <dbl>
##  1 AS        709            189               0.267
##  2 HA        342             97               0.284
##  3 AA      31947          10706               0.335
##  4 VX       5116           1746               0.341
##  5 DL      47658          16413               0.344
##  6 OO         29             10               0.345
##  7 US      19831           7349               0.371
##  8 9E      17294           6637               0.384
##  9 UA      57782          22222               0.385
## 10 B6      54049          23609               0.437
## 11 WN      12044           5304               0.440
## 12 MQ      25037          11693               0.467
## 13 YV        544            258               0.474
## 14 EV      51108          24484               0.479
## 15 F9        681            392               0.576
## 16 FL       3175           1895               0.597

5.6.5 Grouping by multiple variables

Quando agrupamos por múltiplas variáveis, cada sumario vai ser feito de uma camada do agrupamento. assim podemos subir progressivamente a análise caso desejado.

diario <- group_by(flights,year,month,day)

(por_dia <- summarise(diario,voos=n() ) )
## `summarise()` has grouped output by 'year', 'month'. You can override using the `.groups` argument.
## # A tibble: 365 x 4
## # Groups:   year, month [12]
##     year month   day  voos
##    <int> <int> <int> <int>
##  1  2013     1     1   842
##  2  2013     1     2   943
##  3  2013     1     3   914
##  4  2013     1     4   915
##  5  2013     1     5   720
##  6  2013     1     6   832
##  7  2013     1     7   933
##  8  2013     1     8   899
##  9  2013     1     9   902
## 10  2013     1    10   932
## # ... with 355 more rows
(por_mes <- summarise(por_dia,voos=sum(voos)))
## `summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
## # A tibble: 12 x 3
## # Groups:   year [1]
##     year month  voos
##    <int> <int> <int>
##  1  2013     1 27004
##  2  2013     2 24951
##  3  2013     3 28834
##  4  2013     4 28330
##  5  2013     5 28796
##  6  2013     6 28243
##  7  2013     7 29425
##  8  2013     8 29327
##  9  2013     9 27574
## 10  2013    10 28889
## 11  2013    11 27268
## 12  2013    12 28135
(por_ano <- summarise(por_mes,voos=sum(voos)))
## # A tibble: 1 x 2
##    year   voos
##   <int>  <int>
## 1  2013 336776

Esse sistema de subir pelos agrupamentos é bom para somas e contagens porem quando estamos tratando de medias, variâncias e outras medidas estatísticas ele não deve ser usado sem cautela.

5.6.6 Ungrouping

Se quisermos fazer a operação sem agrupamento o comando ungroup funciona.

diario %>% ungroup() %>% summarise(voos=n())
## # A tibble: 1 x 1
##     voos
##    <int>
## 1 336776

Exercícios 5.6.7

  1. Crie outras maneiras de chegar aos mesmos resultados do que os resultados a seguir (sem usar count) :
x <- naocancelados %>% count(dest)

naocancelados %>% count(tailnum, wt = distance)
## # A tibble: 4,037 x 2
##    tailnum      n
##    <chr>    <dbl>
##  1 D942DN    3418
##  2 N0EGMQ  239143
##  3 N10156  109664
##  4 N102UW   25722
##  5 N103US   24619
##  6 N104UW   24616
##  7 N10575  139903
##  8 N105UW   23618
##  9 N107US   21677
## 10 N108UW   32070
## # ... with 4,027 more rows
naocancelados %>% group_by(dest )%>% summarise(n())
## # A tibble: 104 x 2
##    dest  `n()`
##    <chr> <int>
##  1 ABQ     254
##  2 ACK     264
##  3 ALB     418
##  4 ANC       8
##  5 ATL   16837
##  6 AUS    2411
##  7 AVL     261
##  8 BDL     412
##  9 BGR     358
## 10 BHM     269
## # ... with 94 more rows
naocancelados %>% group_by(tailnum) %>% summarise(distanciatot = sum(distance))
## # A tibble: 4,037 x 2
##    tailnum distanciatot
##    <chr>          <dbl>
##  1 D942DN          3418
##  2 N0EGMQ        239143
##  3 N10156        109664
##  4 N102UW         25722
##  5 N103US         24619
##  6 N104UW         24616
##  7 N10575        139903
##  8 N105UW         23618
##  9 N107US         21677
## 10 N108UW         32070
## # ... with 4,027 more rows
  1. A definição usada para voo cancelado é (is.na(dep_delay) | is.na(arr_delay) ), se não temos informações sobre o horario de chegada ou não temos informação sobre o horario de saída consideramos cancelado. Essa definição não é a ideal, por que? Qual a coluna mais importante?
Consideramos um voo que não chegou como cancelado, mesmo que ele tenha saído, Caso aconteça um pouso de emergência ou um acidente estariamos considerando esse voo como cancelado. A coluna mais importante entre essas duas seria a dep_time pois caso o avião saía, mesmo que mude de destino e/ou não chegue ele considera que o voo ocorreu.
  1. Olhe para o número de voos cancelados por dia, existe um padrão? Existe uma relação com o atraso médio por dia?
voo_dia <- flights %>% group_by(year,month,day) %>% 
  summarise(previstos = n(),percentual_canc = mean(is.na(dep_time)),atrasomedio = mean(dep_delay,na.rm=T))
## `summarise()` has grouped output by 'year', 'month'. You can override using the `.groups` argument.
ggplot(voo_dia) + 
  geom_point(aes(x = atrasomedio , y=percentual_canc)) +
  geom_smooth(aes(x=atrasomedio,y=percentual_canc),se=F) +
  labs(title ='Percentual de voos cancelados em relação ao atraso médio dos voos que aconteceram',xlab='Atraso Médio',ylab='Percentual de cancelados')
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

É possível perceber uma correlação positiva entre o atraso médio dos voos e o percentual de cancelados.

  1. Qual companhia tem os maiores delays?
naocancelados %>% group_by(carrier) %>% summarise(delay_med_saida = mean(dep_delay),delay_med_chegada = mean(arr_delay)) %>% mutate(total = (delay_med_saida + delay_med_chegada)/2) %>% arrange(total)
## # A tibble: 16 x 4
##    carrier delay_med_saida delay_med_chegada total
##    <chr>             <dbl>             <dbl> <dbl>
##  1 AS                 5.83            -9.93  -2.05
##  2 HA                 4.90            -6.92  -1.01
##  3 US                 3.74             2.13   2.94
##  4 AA                 8.57             0.364  4.47
##  5 DL                 9.22             1.64   5.43
##  6 VX                12.8              1.76   7.26
##  7 UA                12.0              3.56   7.79
##  8 MQ                10.4             10.8   10.6 
##  9 B6                13.0              9.46  11.2 
## 10 9E                16.4              7.38  11.9 
## 11 OO                12.6             11.9   12.3 
## 12 WN                17.7              9.65  13.7 
## 13 YV                18.9             15.6   17.2 
## 14 EV                19.8             15.8   17.8 
## 15 FL                18.6             20.1   19.4 
## 16 F9                20.2             21.9   21.1
  1. O que o argumento sort para count faz? Quando é útil?
naocancelados %>% count(carrier,sort=T)
## # A tibble: 16 x 2
##    carrier     n
##    <chr>   <int>
##  1 UA      57782
##  2 B6      54049
##  3 EV      51108
##  4 DL      47658
##  5 AA      31947
##  6 MQ      25037
##  7 US      19831
##  8 9E      17294
##  9 WN      12044
## 10 VX       5116
## 11 FL       3175
## 12 AS        709
## 13 F9        681
## 14 YV        544
## 15 HA        342
## 16 OO         29

O argumento sort coloca os maiores valores do que foi contado em cima. Quando queremo saber os que mais vezes se repetem é útil.

5.7 Grouped Mutates (and filters)

Apesar de ser mais usado em sumários os agrupamentos tambem servem para mutates e filters.

Encontrar os piores membros de cada grupo.

flights_aux %>% group_by(year,month,day) %>% filter(rank(desc(arr_delay))<10)
## # A tibble: 3,306 x 7
## # Groups:   year, month, day [365]
##     year month   day dep_delay arr_delay distance air_time
##    <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl>
##  1  2013     1     1       853       851      184       41
##  2  2013     1     1       290       338     1134      213
##  3  2013     1     1       260       263      266       46
##  4  2013     1     1       157       174      213       60
##  5  2013     1     1       216       222      708      121
##  6  2013     1     1       255       250      589      115
##  7  2013     1     1       285       246     1085      146
##  8  2013     1     1       192       191      199       44
##  9  2013     1     1       379       456     1092      222
## 10  2013     1     2       224       207      550       94
## # ... with 3,296 more rows
(popular_dest <- flights %>% group_by(dest) %>% filter(n()>15000))
## # A tibble: 66,180 x 19
## # Groups:   dest [4]
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      554            600        -6      812            837
##  2  2013     1     1      554            558        -4      740            728
##  3  2013     1     1      558            600        -2      753            745
##  4  2013     1     1      558            600        -2      924            917
##  5  2013     1     1      559            559         0      702            706
##  6  2013     1     1      600            600         0      837            825
##  7  2013     1     1      606            610        -4      837            845
##  8  2013     1     1      608            600         8      807            735
##  9  2013     1     1      615            615         0      833            842
## 10  2013     1     1      628            630        -2     1016            947
## # ... with 66,170 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Padronizar para encontrar métricas por grupo.

popular_dest %>% filter(arr_delay>0) %>% mutate(prop_delay=arr_delay/sum(arr_delay)) %>% 
  select(year:day,dest,arr_delay,prop_delay)
## # A tibble: 24,854 x 6
## # Groups:   dest [4]
##     year month   day dest  arr_delay prop_delay
##    <int> <int> <int> <chr>     <dbl>      <dbl>
##  1  2013     1     1 ORD          12 0.0000424 
##  2  2013     1     1 ORD           8 0.0000283 
##  3  2013     1     1 LAX           7 0.0000344 
##  4  2013     1     1 ATL          12 0.0000400 
##  5  2013     1     1 ORD          32 0.000113  
##  6  2013     1     1 LAX          29 0.000143  
##  7  2013     1     1 ORD          14 0.0000495 
##  8  2013     1     1 ORD           4 0.0000141 
##  9  2013     1     1 ATL           5 0.0000167 
## 10  2013     1     1 LAX           2 0.00000984
## # ... with 24,844 more rows

Exercícios 5.7.1

  1. Qual avião teve mais atrasos de chegada? Considerando apenas aviões que voaram mais de 20 vezes.
naocancelados %>% group_by(tailnum) %>% filter(n()>20) %>% summarise(prop = mean(arr_delay >0)) %>% mutate(rk= min_rank(desc(prop))) %>% arrange(rk)
## # A tibble: 3,120 x 3
##    tailnum  prop    rk
##    <chr>   <dbl> <int>
##  1 N988AT  0.8       1
##  2 N983AT  0.75      2
##  3 N980AT  0.745     3
##  4 N969AT  0.735     4
##  5 N932AT  0.733     5
##  6 N149AT  0.727     6
##  7 N954AT  0.724     7
##  8 N265WN  0.72      8
##  9 N267AT  0.714     9
## 10 N353AT  0.714     9
## # ... with 3,110 more rows
  1. Qual horarío do dia voce deve voar para evitar atrasos?
naocancelados  %>% group_by(hour) %>% summarise(media=mean(arr_delay)) %>% mutate(rank= min_rank(media)) %>% arrange(rank)
## # A tibble: 19 x 3
##     hour  media  rank
##    <dbl>  <dbl> <int>
##  1     7 -5.30      1
##  2     5 -4.80      2
##  3     6 -3.38      3
##  4     9 -1.45      4
##  5     8 -1.11      5
##  6    10  0.954     6
##  7    11  1.48      7
##  8    12  3.49      8
##  9    13  6.54      9
## 10    14  9.20     10
## 11    23 11.8      11
## 12    15 12.3      12
## 13    16 12.6      13
## 14    18 14.8      14
## 15    22 16.0      15
## 16    17 16.0      16
## 17    19 16.7      17
## 18    20 16.7      18
## 19    21 18.4      19

Voce deve voar as 7 da manhã, mas como caso geral, mais cedo costuma ser menos atrasado.

  1. Para cada destino calcule o atraso total. Para cado voo calcule a proporção de atrasos para aquele destino.
naocancelados %>% filter(arr_delay >0) %>% group_by(dest) %>% mutate(total=sum(arr_delay),prop = arr_delay/total) %>% select(dest,month,day,dep_time,carrier,flight,arr_delay,prop) %>% arrange(dest,desc(prop))
## # A tibble: 133,004 x 8
## # Groups:   dest [103]
##    dest  month   day dep_time carrier flight arr_delay   prop
##    <chr> <int> <int>    <int> <chr>    <int>     <dbl>  <dbl>
##  1 ABQ       7    22     2145 B6        1505       153 0.0341
##  2 ABQ      12    14     2223 B6          65       149 0.0332
##  3 ABQ      10    15     2146 B6          65       138 0.0308
##  4 ABQ       7    23     2206 B6        1505       137 0.0305
##  5 ABQ      12    17     2220 B6          65       136 0.0303
##  6 ABQ       7    10     2025 B6        1505       126 0.0281
##  7 ABQ       7    30     2212 B6        1505       118 0.0263
##  8 ABQ       7    28     2038 B6        1505       117 0.0261
##  9 ABQ      12     8     2049 B6          65       114 0.0254
## 10 ABQ       9     2     2212 B6        1505       109 0.0243
## # ... with 132,994 more rows
  1. Usando lag() análise como um voo atrasado interfere nos atrasos dos voos seguintes.
gr <- naocancelados %>% arrange(origin,month,day,dep_time) %>% group_by(origin) %>% mutate(dep_lag_delay = lag(dep_delay)) %>% filter(!is.na(dep_delay),!is.na(dep_lag_delay))

Agora podemos fazer um gráfico considerando agrupando os voos que tiveram atraso do voo anterior igual.

gr %>% group_by(origin,dep_lag_delay) %>% summarise(dep_delay_mean= mean(dep_delay)) %>% ggplot() + geom_point(aes(x=dep_lag_delay,y=dep_delay_mean)) + facet_wrap(~origin)
## `summarise()` has grouped output by 'origin'. You can override using the `.groups` argument.

A tendencia é de que quando um voo anterior está atrasado o proximo tambem esteja.

  1. Tente encontrar voos que são suspeitamente rápidos, baseado em destino. Que podem indicar erro de entrada de dados.
naocancelados %>% group_by(origin,dest) %>% mutate(media=mean(air_time),desvio= sd(air_time)) %>% filter(air_time < media - 3*desvio)
## # A tibble: 23 x 21
## # Groups:   origin, dest [19]
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1    12     1559           1600        -1     1849           1917
##  2  2013     1    25     1954           2000        -6     2131           2114
##  3  2013    10     8     1218           1207        11     1330           1320
##  4  2013    11     3     1720           1645        35     1820           1820
##  5  2013    11    10     2307           2250        17       34              8
##  6  2013     3     2     1450           1500       -10     1547           1608
##  7  2013     3    15      908            830        38     1004            944
##  8  2013     3    23     1914           1910         4     2045           2043
##  9  2013     3    25     2340           2250        50      120              5
## 10  2013     4    28     1557           1610       -13     1723           1755
## # ... with 13 more rows, and 13 more variables: arr_delay <dbl>, carrier <chr>,
## #   flight <int>, tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
## #   distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>, media <dbl>,
## #   desvio <dbl>

Voos 3 desvios padrão fora da média daquela rota.

  1. Encontre destinos que são cobertos por pelo menos duas companhias. Ranqueie o número de destino de cada companhia considerando apenas esses destinos.
naocancelados %>% group_by(dest) %>% mutate(ncar = n_distinct(carrier)) %>% filter(ncar>1) %>% ungroup() %>% group_by(carrier) %>% summarise(ndes= n_distinct(dest)) %>% arrange(desc(ndes))
## # A tibble: 16 x 2
##    carrier  ndes
##    <chr>   <int>
##  1 EV         50
##  2 9E         47
##  3 UA         42
##  4 DL         39
##  5 B6         35
##  6 AA         19
##  7 MQ         19
##  8 WN         10
##  9 OO          5
## 10 US          5
## 11 VX          4
## 12 YV          3
## 13 FL          2
## 14 AS          1
## 15 F9          1
## 16 HA          1

A companhia EV é a que voa para mais destinos voados por duas companhias.

  1. Para cada avião conte a quantidade de voos até o primeiro atraso de mais de uma hora.
naocancelados %>% select(tailnum,dep_delay,month,day) %>% arrange(tailnum,month,day) %>% group_by(tailnum) %>% 
  mutate(cum = cumsum(dep_delay>60)) %>% summarise(total=sum(cum <1)) %>% arrange(total)
## # A tibble: 4,037 x 2
##    tailnum total
##    <chr>   <int>
##  1 D942DN      0
##  2 N10575      0
##  3 N11106      0
##  4 N11109      0
##  5 N11187      0
##  6 N11199      0
##  7 N12967      0
##  8 N13550      0
##  9 N136DL      0
## 10 N13903      0
## # ... with 4,027 more rows